﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using log4net;

/// <summary>
/// Descripción breve de OficinaCRN
/// </summary>
namespace Iudicium.Oficina.CRN
{
    public class OficinaCRN
    {
        private static readonly ILog log = LogManager.GetLogger("LogFile");
        public OficinaCRN()
        {
            //
            // TODO: Agregar aquí la lógica del constructor
            //
        }

        public static int InsertOficina(Oficina objOficina)
        {
            if (objOficina == null)
            {
                throw new ArgumentException("la Oficina no puede ser nulo.");
            }
            if (string.IsNullOrEmpty(objOficina.Nombre))
            {
                throw new ArgumentException("el nombre de la Oficina no puede ser nulo o vacio");
            }

            if (string.IsNullOrEmpty(objOficina.NombreEncargado))
            {
                throw new ArgumentException("el nombre del encargado de la Oficina no puede ser nulo o vacio");
            }

            int? oficinaId = 0;

            OficinaDSTableAdapters.OficinaTableAdapter adapter = new OficinaDSTableAdapters.OficinaTableAdapter();

            adapter.Insert(ref oficinaId, objOficina.Nombre,objOficina.NombreEncargado);


            if (oficinaId == null)
            {
                throw new Exception("La sentencia SQL se ejecuto correctamente pero no se genero la llave primaria");
            }

            return oficinaId.Value;
        }

        public static void UpdateOficina(Oficina objOficina)
        {
            if (objOficina == null)
            {
                throw new ArgumentException("El Oficina no puede ser nulo.");
            }
            if (objOficina.OficinaId <= 0)
            {
                throw new ArgumentException("OficinaId no puede ser menor o igual que cero.");
            }
            if (string.IsNullOrEmpty(objOficina.Nombre))
            {
                throw new ArgumentException("el nombre de la Oficina no puede ser nulo o vacio");
            }
            if (string.IsNullOrEmpty(objOficina.NombreEncargado))
            {
                throw new ArgumentException("el nombre del encargado de la Oficina no puede ser nulo o vacio");
            }
            OficinaDSTableAdapters.OficinaTableAdapter adpater =
                   new OficinaDSTableAdapters.OficinaTableAdapter();

            adpater.Update(objOficina.OficinaId, objOficina.Nombre,objOficina.NombreEncargado);

        }

        public static void DeleteOficina(int OficinaId)
        {
            if (OficinaId <= 0)
            {
                throw new ArgumentException("OficinaId no puede ser menor o igual que cero.");
            }
            OficinaDSTableAdapters.OficinaTableAdapter adpater =
                  new OficinaDSTableAdapters.OficinaTableAdapter();

            adpater.Delete(OficinaId);

        }

        public static Oficina GetOficinaById(int OficinaId)
        {
            if (OficinaId <= 0)
            {
                throw new ArgumentException("OficinaId no puede ser menor o igual que cero.");
            }

            OficinaDSTableAdapters.OficinaTableAdapter adpater =
                new OficinaDSTableAdapters.OficinaTableAdapter();

            OficinaDS.OficinaDataTable tabla =
                adpater.GetOficinaById(OficinaId);

            if (tabla == null || tabla.Rows.Count == 0)
            {
                throw new Exception("No se pudo obtener la Oficina " + OficinaId + " de la base de datos");
            }
            return ConstruirOficina(tabla[0]);
        }

        public static List<Oficina> GetOficinaBySearch(string parametro)
        {
            List<Oficina> lista = new List<Oficina>();

            OficinaDSTableAdapters.OficinaTableAdapter adpater =
                  new OficinaDSTableAdapters.OficinaTableAdapter();

            OficinaDS.OficinaDataTable tabla =
                adpater.GetOficinaBySearch(parametro);

            if (tabla == null)
            {
                throw new Exception("No se pudo obtener resultados de la busqueda con el parametro " +
                    parametro +
                    " de la base de datos");
            }

            foreach (OficinaDS.OficinaRow row in tabla)
            {
                Oficina obj = ConstruirOficina(row);
                if (obj != null)
                    lista.Add(obj);
            }
            return lista;
        }

        public static Oficina ConstruirOficina(OficinaDS.OficinaRow row)
        {
            if (row == null)
                return null;
            return new Oficina(row.oficinaId, row.nombre,row.nombreEncargado);

        }
    }
}
